home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1996 September / JCSM Shareware Collection (JCS Distribution) (September 1996).ISO / prgtools / njsdk30.zip / NJCARD.C < prev    next >
Text File  |  1994-03-20  |  15KB  |  583 lines

  1. /*  NJCARD.C - a demonstration program to show how to use NJSDK.
  2.  *
  3.  *  Copyright (C) Hongbo Ni 1992-1993. All Rights Reserved.
  4.  *
  5.  *  Last modified: 22:45:37 Sun  03-21-1993
  6.  *------------------------------------------------------------------------*/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <dos.h>
  11. #include <math.h>
  12. #include <malloc.h>
  13. #include <process.h>
  14.  
  15. #include "njsdk.h"
  16. #include "keys.h"
  17.  
  18.  
  19. int msgdialog(int, int s);
  20. #define MAXDLOG 21
  21. #define MAXNO   10
  22. struct DIALOG_S dlog[MAXDLOG]={
  23. /*  R  C  L T R    str  msg */
  24.   { 3,8,51,0,0,   "","╟δ╩Σ╚δ╨╒├√ú¿╧╚╓╨╬─║≤╙ó╬─ú⌐"},
  25.   { 4,8,51,0,0,   "","╟δ╩Σ╚δ╣½╦╛├√│╞"},
  26.   { 5,8,51,0,0,   "","╟δ╩Σ╚δ╜╓║┼╗≥╨┼╧Σ║┼"},
  27.   { 6,8,51,0,0,   "","╟δ╩Σ╚δ│╟╩╨├√ú¼╓▌ú»╩í├√ú¼╙╩╒■▒α┬δ"},
  28.   { 7,8,51,0,0,   "","╟δ╩Σ╚δ╣·╝╥├√"},
  29.   { 9,8,51,0,0,   "","╟δ╩Σ╚δ╡τ╫╙╙╩╓╖ (EMAIL ADDRESS)"},
  30.   {10,8,51,0,0,   "","╟δ╩Σ╚δ┤½╒µ║┼┬δ"},
  31.   {11,8,51,0,0,   "","╟δ╩Σ╚δ╡τ╗░║┼┬δ"},
  32.   {13,8,51,0,0,   "","╟δ╩Σ╚δ▒╕═ⁿ┬╝"},
  33.   {14,8,51,0,0,   "","╟δ╩Σ╚δ▒╕═ⁿ┬╝"},
  34.   {15,8,51,0,0,   "","╟δ╩Σ╚δ▒╕═ⁿ┬╝"},
  35.  
  36.   {17,2, 6, -2,1,  "╠ß╩╛","╠ß╩╛╗≥▓╗╠ß╩╛"},
  37.   {1,65,10,-1,1,   "╔╧╥╗╝═┬╝","▓Θ┐┤╔╧╥╗╝═┬╝"},
  38.   {3,65,10,-1,1,   "╧┬╥╗╝═┬╝","▓Θ┐┤╧┬╥╗╝═┬╝"},
  39.   {5,65,10,-1,1,   "▓Θ╒╥╨╒├√","░┤╨╒├√▓Θ╒╥╝═┬╝"},
  40.   {7,65,10,-1,1,   "╘÷╝╙╝═┬╝","╘÷╝╙╝═┬╝"},
  41.   {9 ,65,10,-1,1,  "╔╛│²╝═┬╝","╔╛│²╡▒╟░╝═┬╝"},
  42.   {11,65,10,-1,1,  "╫╘╢»▓ª║┼","╙├ MODEM ▓ª╡τ╗░║┼┬δ"},
  43.   {13,65,10,-1,1,  "╚í╧√╕─╢»","╖┼╞·╡▒╟░╝═┬╝╡─╕─╢»"},
  44.   {15,65,10,-1,1,  "┤µ┼╠═╦│÷","╜½╦∙╙╨╝═┬╝┤µ┼╠▓ó═╦│÷"},
  45.   {17,65,10,-1,1,  "┤≥╙í▒Ω╟⌐","┤≥╙í╡▒╟░╗≥╦∙╙╨╝╟┬╝╡─╙╩╝─▒Ω╟⌐"}
  46. };
  47. char *ver={"C"};
  48. int msgline(char *msg);
  49. char *timedate(char *str);
  50. struct NJVIDEO V;
  51.  
  52. int myautosave();
  53. main(int argc, char **argv)
  54. {
  55.     char str[80],i,j,k;
  56.  
  57.     ReadDatabase();
  58.     NJ_init(argv[0]);
  59.     NJ_AutoSave(myautosave);
  60.     NJ_getvideo(&V);
  61.  
  62.     i = dialog();
  63.     NJ_end();
  64.     if(i>=0){
  65.        WriteDataBase();
  66.     }
  67.     exit(0);
  68. }
  69. int dialog()
  70. {
  71.        NJ_window(0, 0, 19*V.PixelsPerRow, 80, 1);
  72.        NJ_window(0, 62,19*V.PixelsPerRow, 18, 7);
  73.        paint();
  74.        NJ_dialog( 15, 1, 14,3, 0,7, dlog, MAXDLOG, 0,  msgdialog, msgline);
  75. }
  76.  
  77. int paint()
  78. {
  79.     NJ_puts("í║─╧ ╝½ ╨╟í╗ ═¿ ╤╢ ┬╝",1,20,15,1);
  80.     NJ_puts("╨╒├√ú║", 3, 2, 11, 1);
  81.     NJ_puts("╣½╦╛ú║", 4, 2, 11, 1);
  82.     NJ_puts("╡╪╓╖ú║", 5, 2, 11, 1);
  83.     NJ_puts("EMAIL:", 9, 2, 11, 1);
  84.     NJ_puts("┤½╒µú║",10, 2, 11, 1);
  85.     NJ_puts("╡τ╗░ú║",11, 2, 11, 1);
  86.     NJ_puts("▒╕╫óú║",13, 2, 11, 1);
  87.     if(V.Nrows>20){
  88.        NJ_window(19*V.PixelsPerRow+8,0, 4*V.PixelsPerRow, 80, 8);
  89.        NJ_puts("╚τ╣√─·╧▓╗╢╩╣╙├í║─╧╝½╨╟í╗═¿╤╢┬╝ú¼╟δ╝─ US$19 ╓º│╓╫≈╒▀╝╠╨°┐¬╖óíú",21, 10, 10, 8);
  90.        NJ_puts("Copyright (c) Hongbo Ni, P.O. Box 40, Epping NSW 2121, AUSTRALIA",22, 8, 10, 8);
  91.     }
  92. }
  93. static oi=0;
  94. int msgline(char *msg)
  95. {
  96.     int i = strlen(msg);
  97.  
  98.     NJ_clscolum(17,(64-oi)/2,oi,1);
  99.     if(dlog[MAXDLOG-10].radio){
  100.        oi = i;
  101.        i = (64-i)/2;
  102.        NJ_puts(msg,17,i,14,4);
  103.     }
  104. }
  105.  
  106. /* Process the dialog messages */
  107. int msgdialog(int key, int s)
  108. {
  109.     int r=1;
  110.     if(key==-1){    /* Initialise dialog Box */
  111.        GetCurrent();
  112.     }else if(key==0){    /* a Button is pressed */
  113.        if(s==MAXDLOG-3){        /* Undo Editing */
  114.           UndoEditing();
  115.        }else{
  116.           KeepCurrent();
  117.           if(s==MAXDLOG-1) { /* Print */
  118.              PrintRecord();
  119.           }else if(s==MAXDLOG-2) { /* Save and Quit */
  120.              SaveRecord();
  121.              r=0;
  122.           }else if(s==MAXDLOG-4) { /* Call */
  123.              PhoneCall();
  124.           }else if(s==MAXDLOG-5) { /* Delete Record */
  125.              DelRecord();
  126.           }else if(s==MAXDLOG-6) { /* Add Record */
  127.              AddRecord();
  128.           }else if(s==MAXDLOG-7) { /* Search */
  129.              SearchRecord();
  130.           }else if(s==MAXDLOG-8) { /* Next Record */
  131.              NextRecord();
  132.           }else if(s==MAXDLOG-9) { /* Previous Rec */
  133.              PrevRecord();
  134.           }else r=2;
  135.        }
  136.     }else{                /* a Key is pressed */
  137.        if(key==PGUP){
  138.           KeepCurrent();
  139.           if(PrevRecord()<0) r=2;
  140.        }else if(key==PGDN){
  141.           KeepCurrent();
  142.           if(NextRecord()<0) return(2);
  143.        }else if(key==CTRL_HOME){
  144.           KeepCurrent();
  145.           FirstRecord();
  146.        }else if(key==CTRL_END){
  147.           KeepCurrent();
  148.           LastRecord();
  149.        }else r=2;
  150.        msgline("\0");
  151.     }
  152.     DisplayCount();
  153.     return(r);
  154. }
  155. /*------------------------------------------------------------------------*/
  156. /* Simple In Memory Address Database Management                                    */
  157. /*                                                                        */
  158. /* Following codes are nothing to do with NJSDK, just to show how a       */
  159. /* Database can be interfaced with NJSDK.                                 */
  160. /*------------------------------------------------------------------------*/
  161. struct Record {
  162.     uchar name[51];
  163.     uchar company[51];
  164.     uchar address1[51];
  165.     uchar address2[51];
  166.     uchar address3[51];
  167.     uchar email[51];
  168.     uchar phone[51];
  169.     uchar fax[51];
  170.     uchar comment1[51];
  171.     uchar comment2[51];
  172.     uchar comment3[51];
  173.     struct Record *next;
  174.     struct Record *prev;
  175. };
  176. struct Record R, *root=NULL, *Rptr, *TmpRec;
  177. int TotalRecord=0;
  178. char str2[80];
  179. int DisplayCount()
  180. {
  181.     int c=0;
  182.     TmpRec=root;
  183.     while(TmpRec!=NULL){
  184.         c++;
  185.         if(TmpRec==Rptr) break;
  186.         TmpRec=TmpRec->next;
  187.     }
  188.     sprintf(str2,"%3d/%-3d",c,TotalRecord);
  189.     NJ_puts(str2,2,53,14,1);
  190. }
  191. int Add(struct Record *record)
  192. {
  193.     struct Record *r;
  194.     r = (struct Record *)malloc(sizeof(struct Record));
  195.     if(r==NULL){
  196.         msgline("╝═┬╝╠½╢αú¼─┌┤µ▓╗╣╗úí");
  197.         return(0);
  198.     }
  199.     memmove(r, record, sizeof(struct Record));
  200.     if(root==NULL){
  201.         root=r;
  202.         r->next=r->prev=NULL;
  203.     }else if(r->name[0]==0){
  204.         Rptr = root;
  205.         while(Rptr->next!=NULL){
  206.            Rptr=Rptr->next;
  207.         }
  208.         Rptr->next = r;
  209.         r->prev = Rptr;
  210.         r->next = NULL;
  211.     }else{
  212.         TmpRec= root;
  213.         while(TmpRec->next!=NULL){   /* add the new record in GB order */
  214.             if(strcmp(r->name, TmpRec->name)<0) break;
  215.             TmpRec=TmpRec->next;
  216.         }
  217.         if(strcmp(r->name, TmpRec->name)<0 ){
  218.           (TmpRec->prev)->next = r;
  219.           r->prev = TmpRec->prev;
  220.           r->next = TmpRec;
  221.           TmpRec->prev = r;
  222.           if(TmpRec==root) root=r;
  223.         }else{
  224.           TmpRec->next = r;
  225.           r->prev = TmpRec;
  226.           r->next = NULL;
  227.         }
  228.  
  229.     }
  230.     Rptr = r;
  231.     TotalRecord++;
  232.  
  233. }
  234. int Del(struct Record *r)
  235. {
  236.     if(r==NULL || root==NULL || (r->next==NULL && r->prev==NULL))
  237.        return(0);
  238.     else if(r==root) {
  239.        if(r->next==NULL) Rptr=root=NULL;
  240.        else Rptr=root=root->next;
  241.     }else if(r->next==NULL){
  242.        Rptr=r->prev;
  243.        Rptr->next=NULL;
  244.     }else{
  245.         Rptr=r->next;
  246.         (r->prev)->next = Rptr;
  247.         Rptr->prev = r->prev;
  248.     }
  249.     free(r);
  250.     TotalRecord--;
  251.  
  252. }
  253. FILE *fp;
  254. int readstr(char *str)
  255. {
  256.     int c;
  257.     char *p1,*p2;
  258.     while((c=fgetc(fp))!='"' && !feof(fp));
  259.     if(feof(fp)) return(-1);
  260.     p1=str;
  261.     while((c=fgetc(fp))!='"'){
  262.         *p1++ = c;
  263.     };
  264.     *p1=0;
  265.     return(0);
  266. }
  267. int ReadDatabase()
  268. {
  269.     int i,j=0;
  270.     uchar *p;
  271.  
  272.     fp=fopen("NJCARD.DBS","r");
  273.     if(fp!=NULL){
  274.        do{
  275.           i  = readstr(R.name);
  276.           i += readstr(R.company);
  277.           i += readstr(R.address1);
  278.           i += readstr(R.address2);
  279.           i += readstr(R.address3);
  280.           i += readstr(R.email);
  281.           i += readstr(R.fax);
  282.           i += readstr(R.phone);
  283.           i += readstr(R.comment1);
  284.           i += readstr(R.comment2);
  285.           i += readstr(R.comment3);
  286.  
  287.           if(feof(fp)) break;
  288.           if(i>=0) Add(&R);
  289.        }while(1);
  290.        fclose(fp);
  291.     }else AddRecord();
  292. }
  293. int WriteDataBase()
  294. {
  295.     int i,j=0;
  296.     uchar *p;
  297.     FILE *fgb;
  298.  
  299.     fp=fopen("NJCARD.DBS","w");
  300.     fgb=fopen("NJCARD.GB","w");
  301.     if(fp!=NULL){
  302.        TmpRec=root;
  303.        fprintf(fgb,"              í║─╧ ╝½ ╨╟í╗ ═¿ ╤╢ ┬╝\n\n");
  304.        while(TmpRec!=NULL){
  305.           fprintf(fgb,"╨╒├√ú║ %s\n",TmpRec->name);
  306.           fprintf(fgb,"╣½╦╛ú║ %s\n",TmpRec->company);
  307.           fprintf(fgb,"╡╪╓╖ú║ %s\n",TmpRec->address1);
  308.           fprintf(fgb,"       %s\n",TmpRec->address2);
  309.           fprintf(fgb,"       %s\n",TmpRec->address3);
  310.           fprintf(fgb,"EMAIL: %s\n",TmpRec->email);
  311.           fprintf(fgb,"┤½╒µú║ %s\n",TmpRec->fax);
  312.           fprintf(fgb,"╡τ╗░ú║ %s\n",TmpRec->phone);
  313.           fprintf(fgb,"▒╕╫óú║ %s\n",TmpRec->comment1);
  314.           fprintf(fgb,"       %s\n\n",TmpRec->comment2);
  315.           fprintf(fgb,"       %s\n\n",TmpRec->comment3);
  316.  
  317.           fprintf(fp,"\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n",
  318.            TmpRec->name, TmpRec->company, TmpRec->address1, TmpRec->address2,
  319.            TmpRec->address3,TmpRec->email,TmpRec->fax, TmpRec->phone,
  320.            TmpRec->comment1, TmpRec->comment2,TmpRec->comment3);
  321.            TmpRec=TmpRec->next;
  322.        }
  323.        fclose(fp);
  324.        fclose(fgb);
  325.     }
  326.  
  327. }
  328.  
  329. int myautosave()
  330. {
  331.     msgline("Autosaving DataBase...");
  332.     WriteDataBase();
  333.     msgline("\0");
  334.     /* do something here */
  335. }
  336.  
  337. int UndoEditing()
  338. {
  339.     GetCurrent();
  340.     msgline("\0");
  341. }
  342. int SaveRecord()
  343. {
  344.     WriteDataBase();
  345. }
  346. char Name[51]="\0";
  347. int SearchRecord()
  348. {
  349.     int found=0;
  350.     char s2[80];
  351.  
  352.     TmpRec=Rptr;
  353.     if(NJ_gets(Name,3,8,51,15,0)<0) return(0);
  354.     while(TmpRec->next!=NULL){
  355.         TmpRec=TmpRec->next;
  356.         if(strstr(TmpRec->name,Name)!=NULL) {found=1; break;}
  357.     }
  358.     if(!found){
  359.         TmpRec=root;
  360.         do{
  361.             if(strstr(TmpRec->name,Name)!=NULL) {found=1; break;}
  362.             if(TmpRec==Rptr) break;
  363.             TmpRec=TmpRec->next;
  364.         }while(1);
  365.     }
  366.     if(found){
  367.        Rptr=TmpRec;
  368.        GetCurrent();
  369.        msgline("\0");
  370.     }else{
  371.        sprintf(s2,"╒╥▓╗╡╜┤╦╚╦ú█%sú▌",Name);
  372.        msgline(s2);
  373.     }
  374.     return(0);
  375.  
  376. }
  377. int NextRecord()
  378. {
  379.     if(Rptr->next!=NULL){
  380.        Rptr = Rptr->next;
  381.        GetCurrent();
  382.        return(0);
  383.     }else return(-1);
  384. }
  385. int PrevRecord()
  386. {
  387.     if(Rptr->prev!=NULL){
  388.        Rptr = Rptr->prev;
  389.        GetCurrent();
  390.        return(0);
  391.     }else return(-1);
  392. }
  393. int FirstRecord()
  394. {
  395.     Rptr = root      ;
  396.     GetCurrent();
  397.     return(0);
  398. }
  399. int LastRecord()
  400. {
  401.     Rptr = root      ;
  402.     while(Rptr->next!=NULL){
  403.         Rptr=Rptr->next;
  404.     }
  405.     GetCurrent();
  406.     return(0);
  407. }
  408. int AddRecord()
  409. {
  410.     strcpy(dlog[0].str,"\0");
  411.     strcpy(dlog[1].str,"\0");
  412.     strcpy(dlog[2].str,"\0");
  413.     strcpy(dlog[3].str,"\0");
  414.     strcpy(dlog[4].str,"\0");
  415.     strcpy(dlog[5].str,"\0");
  416.     strcpy(dlog[6].str,"\0");
  417.     strcpy(dlog[7].str,"\0");
  418.     strcpy(dlog[8].str,"\0");
  419.     strcpy(dlog[9].str,"\0");
  420.     strcpy(dlog[10].str,"\0");
  421.  
  422.     strcpy(R.name,     "\0");
  423.     strcpy(R.company,  "\0");
  424.     strcpy(R.address1, "\0");
  425.     strcpy(R.address2, "\0");
  426.     strcpy(R.address3, "\0");
  427.     strcpy(R.email,    "\0");
  428.     strcpy(R.fax,      "\0");
  429.     strcpy(R.phone,    "\0");
  430.     strcpy(R.comment1, "\0");
  431.     strcpy(R.comment2, "\0");
  432.     strcpy(R.comment3, "\0");
  433.     Add(&R);
  434.  
  435. }
  436. int DelRecord()
  437. {
  438.     int i;
  439.     msgline("╔╛│²╡▒╟░╝═┬╝ -- ─π┐╧╢¿┬≡(Yes/No)?");
  440.     i=NJ_getkey();
  441.     if(i=='Y' || i=='y'){
  442.        Del(Rptr);
  443.        GetCurrent();
  444.     }
  445.     msgline("\0");
  446. }
  447. int GetCurrent()
  448. {
  449.     strcpy(dlog[0].str,Rptr->name);
  450.     strcpy(dlog[1].str,Rptr->company);
  451.     strcpy(dlog[2].str,Rptr->address1);
  452.     strcpy(dlog[3].str,Rptr->address2);
  453.     strcpy(dlog[4].str,Rptr->address3);
  454.     strcpy(dlog[5].str,Rptr->email);
  455.     strcpy(dlog[6].str,Rptr->fax);
  456.     strcpy(dlog[7].str,Rptr->phone);
  457.     strcpy(dlog[8].str,Rptr->comment1);
  458.     strcpy(dlog[9].str,Rptr->comment2);
  459.     strcpy(dlog[10].str,Rptr->comment3);
  460.  
  461. }
  462. int KeepCurrent()
  463. {
  464.     strcpy(Rptr->name,     dlog[0].str);
  465.     strcpy(Rptr->company,  dlog[1].str);
  466.     strcpy(Rptr->address1, dlog[2].str);
  467.     strcpy(Rptr->address2, dlog[3].str);
  468.     strcpy(Rptr->address3, dlog[4].str);
  469.     strcpy(Rptr->email,    dlog[5].str);
  470.     strcpy(Rptr->fax,      dlog[6].str);
  471.     strcpy(Rptr->phone,    dlog[7].str);
  472.     strcpy(Rptr->comment1, dlog[8].str);
  473.     strcpy(Rptr->comment2, dlog[9].str);
  474.     strcpy(Rptr->comment3, dlog[10].str);
  475. }
  476.  
  477. static char Date[20];
  478. char *getdate()
  479. {
  480.     union REGS r;
  481.     r.h.ah = 0x2A;
  482.     int86(0x21, &r, &r);
  483.     sprintf(Date,"%02d/%02d/%d", r.h.dl, r.h.dh, r.x.cx);
  484.     return (Date);
  485. }
  486. /*=====================================================================*/
  487. int ComPort=1;
  488. char prefix[15]={""}, comport[5]={"1"};
  489. int PhoneCall()
  490. {
  491.     NJ_puts("Prefix:", 12, 8, 15,1);
  492.     if(NJ_gets0(prefix,12,16,15,15,0)<0) {NJ_clscolum(12,8,52,1); return(0);}
  493.  
  494.     NJ_puts("COM Port:", 12, 35, 15,1);
  495.     if(NJ_gets0(comport,12,45,5,15,0)<0) {NJ_clscolum(12,8,52,1); return(0);}
  496.     ComPort= atoi(comport)-1;
  497.  
  498.     NJ_clscolum(12,8,52,1);
  499.  
  500.     sprintf(str2,"atdt%s-%s\r\n",prefix,dlog[7].str);
  501.     serial_init();
  502.     com_puts(str2);
  503.     sprintf(str2,"Dialing: %s-%s",prefix, dlog[7].str);
  504.     msgline(str2);
  505.     mydelay(100);
  506.     sprintf(str2,"╟δ─├╞≡╡τ╗░ú¼▓ó░┤╚╬╥Γ╝ⁿ...");
  507.     msgline(str2);
  508.     NJ_getkey();
  509.     com_puts("\r\n");
  510.     msgline("\0");
  511. }
  512. int PrintRecord()
  513. {
  514.     int k,i=1;
  515.     char str[80];
  516.     do{
  517.        k = msg("┤≥╙í╖╢╬ºú║ 1-╚½▓┐   2-╡▒╟░╝╟┬╝   X-╚í╧√┤≥╙í  ú┐",1);
  518.     }while(k!='1' && k!='2' && k!='X');
  519.     if(k=='X' ) return(-1);
  520.     if(NJ_prt_init()<0) return(-1);
  521.     NJ_setmargin(0,10,0,0,6);
  522.  
  523.     KeepCurrent();
  524.     if(k=='2' || k=='C') TmpRec = Rptr;
  525.     else TmpRec=root;
  526.     while(TmpRec!=NULL){
  527.        sprintf(str,"                         #%03d",i++);
  528.        NJ_prts(str);
  529.        NJ_prts(TmpRec->name);
  530.        NJ_prts(TmpRec->company);
  531.        NJ_prts(TmpRec->address1);
  532.        NJ_prts(TmpRec->address2);
  533.        NJ_prts(TmpRec->address3);
  534.        NJ_prts(" ");
  535.        NJ_prts(" ");
  536.        NJ_prts(" ");
  537.        if(k=='2' || k=='C') break;
  538.        TmpRec=TmpRec->next;
  539.     }
  540.     NJ_prt_end();
  541. }
  542. int serial_init()
  543. {
  544.     union REGS r;
  545.     r.h.ah = 0;
  546.     r.h.al = 0xe3; /*0x93=2400,8,N,1    0xe3=9600 */
  547.     r.x.dx = ComPort;
  548.     int86(0x14,&r,&r);
  549.     return (r.h.ah);
  550. }
  551. int com_puts(char *str)
  552. {
  553.     while(*str){
  554.         com_putc(*str++);
  555.     }
  556. }
  557. int com_putc(int c)
  558. {
  559.     union REGS r;
  560.     int i;
  561.  
  562.     do{
  563.        i=com_status();
  564.        kbhit();
  565.        if(i&0x80)
  566.        msgline("Time out error detected in serial port");
  567.     }while(!(i&0x20));
  568.     r.h.ah = 1;
  569.     r.h.al = c;
  570.     r.x.dx = ComPort;
  571.     int86(0x14,&r,&r);
  572.     return (r.h.ah);
  573. }
  574. int com_status()
  575. {
  576.     union REGS r;
  577.     r.h.ah = 3;
  578.     r.x.dx = ComPort;
  579.     int86(0x14,&r,&r);
  580.     return (r.h.ah);
  581. }
  582. /*------------------------------------------------------------------------*/
  583.